gusucode.com > VC 达内MFC例子集源码-源码程序 > VC 达内MFC例子集源码-源码程序/code/20110113/day13.txt

    一 组件基础

  1 软件开发的阶段
    1.1 结构化编程
      采用自顶向下的编程方式,划分模块
      和功能的一种编程方式。
    1.2 面向对象编程
      采用对象的方式,将程序抽象成类,
      模拟现实世界,采用继承、多态的方式
      设计软件的一种编程方式。
    1.3 面向组件编程
      将功能和数据封装成二进制代码,采用
      搭积木的方式实现软件的一种编程方式。

  2 组件和优点
    2.1 组件 - 实际是一些可以执行的二进
      制程序,它可以给其他的应用程序、操
      作系统或其他组件提供功能
    2.2 优点
      2.2.1 可以方便的提供软件定制机制
      2.2.2 可以很灵活的提供功能
      2.2.3 可以很方便的实现程序的分布式 
        开发。
  
  3 组件的标准 - COM(Component Object Model )
  
    3.1 COM是一种编程规范,不论任何开发语言
    要实现组件都必须按照这种规范来实现。
    组件和开发语言无关。
    这些编程规范定义了组件的操作、接口的
    访问等等。

    3.2 COM接口
    COM接口是组件的核心,从一定程度上
    讲"COM接口是组件的一切".
    COM接口给用户提供了访问组件的方式.
    通过COM接口提供的函数,可以使用组件
    的功能.    
      
  4 COM组件
    4.1 COM组件-就是在Windows平台下,
    封装在动态库(DLL)或者可执行文件(EXE)
    中的一段代码,这些代码是按照COM的
    规范实现.
    4.2 COM组件的特点
      4.2.1 动态链接
      4.2.2 与编程语言无关
      4.2.3 以二进制方式发布
      
二 COM接口

  1 接口的理解
    DLL的接口 - DLL导出的函数
    类的接口 - 类的成员函数
    COM接口 - 是一个包含了一组函数指针
     的数据结构,这些函数是由组件实现的
     
  2 C++的接口实现
    2.1 C++实现接口的方式,使用抽象类
      定义接口.
    2.2 基于抽象类,派生出子类并实现
      功能.
    2.3 使用 interface 定义接口
      interface ClassA 
      {
      };
    目前VC中,interface其实就是struct
      
  3 接口的动态导出
    3.1 DLL的实现
      3.1.1 接口的的定义
      3.1.2 接口的实现
      3.1.3 创建接口的函数
    3.2 DLL的使用
      3.2.1 加载DLL和获取创建接口的函数
      3.2.2 创建接口
      3.2.3 使用接口的函数
    
  4 接口的生命期
    4.1 问题
     在DLL中使用new创建接口后,在用户
     程序使用完该接口后,如果使用delete
     直接删除,会出现内存异常.
     
     每个模块有自己的内存堆(crtheap)
       EXE - crtheap
       DLL - crtheap
     new/delete/malloc/free默认情况
     下都是从自己所在模块内存堆(crtheap)
     中分配和施放内存.而各个模块的
     这个内存堆是各自独立.所以在DLL中
     使用new分配内存,不能在EXE中delete.
     
   4.2 引用计数和AddRef/Release函数
   
    引用计数 - 就是一个整数,作用是
      表示接口的使用次数
    AddRef - 增加引用计数  +1
    Release - 减少引用计数 -1, 如果
      当引用计数为0,接口被删除
   4.3 使用
     4.3.1 创建接口
     4.3.2 调用AddRef,增加引用计数
     4.3.3 使用接口
     4.3.4 调用Release,减少引用计数
   4.4 注意
     4.4.1 在调用Release之后,接口指针
      不能再使用
     4.4.2 多线程情况下,接口引用计数
      要使用原子锁的方式进行加减
      
  5 接口的查询
    5.1 每个接口都具有唯一标识 GUID
    5.2 实现接口查询函数
      QueryInterface
      
  6 IUnknown 接口
    6.1 IUnknown是微软定义的标准接口
     我们实现所有接口就是继承这个接口
     
    6.2 IUnknown定义了三个函数
     QueryInterface 接口查询函数
     AddRef 增加引用计数
     Release 减少引用计数
      
  7 接口定义语言 - IDL(Interface Definition Language )
   7.1 IDL和MIDL
     IDL - 定义接口的一种语言,与开发
       语言无关.
     MIDL.EXE - 可以将IDL语言定义接口,
       编译成C++语言的接口定义
       
   7.2 IDL的基础
      import "XXXX.idl"
      
      [
        attribute
      ]
      interface A : interface_base
      {
   		}
   		
    7.2.1 Import 导入,相当于C++的
        #include
    7.2.2 使用"[]"定义区域,属性描述
      关键字
       1) object - 后续是对象
       2) uuid - 定义对象GUID
       3) helpstring - 帮助信息
       4) version - 版本
       5) point_default - 后续对象
         中指针的默认使用方式
         比如: uniqune - 表示指针可以
           为空,但是不能修改
  
    7.2.3 对象定义
       1) 父接口是IUnknown接口      
       2) 在对象内添加函数,函数定义必须
       是返回 HRESULT.
       HRESULT是32位整数,返回函数是否
       执行成功,需要使用 SUCCESSED和
       FAILED宏来判断返回值.